const path = require('path')
const webpack = require('webpack')
const CompressionPlugin = require('compression-webpack-plugin')
const { readFileSync, writeFileSync } = require('fs')
const axios = require('axios');
function resolve(dir) {
  return path.join(__dirname, dir)
}

const getVersion = () => {
  let currentTime = new Date()
  let month = currentTime.getMonth() + 1
  let day = currentTime.getDate()
  let hours = currentTime.getHours()
  let minutes = currentTime.getMinutes()
  let v = `${currentTime.getTime()}.v=1.${month}.${day}.${hours}.${minutes}`
  return v
}

const Version = getVersion()

const configPath = resolve('public/vesion.json')
try {
  const writeNewHtml = `{"version":"${Version}","url":"${process.env.VUE_APP_API_BASE_URL}"}`
  writeFileSync(configPath, writeNewHtml)
} catch (error) {
  console.error(`无法读取 ${configPath}:`, error)
}
// vue.config.js

const getConfig = () => {
  const getCssConfig = () => {
    const temp = {
      loaderOptions: {
        less: {
          modifyVars: {
            /* less 变量覆盖，用于自定义 ant design 主题 */
            'primary-color': '#4266E5',
            'link-color': '#4266E5',
            'border-radius-base': '2px'
          },
          javascriptEnabled: true
        }
      }
      // // 是否使用css分离插件 ExtractTextPlugin
      // extract: {
      //   // 修改打包后css文件名   // css打包文件，添加时间戳
      //   filename: `css/[name].[contenthash:8].${Version}.css`, // 此处static/css/xxx 目录根据自己打包情况来定,我使用的就没有static一层,所以直接去掉static即可。根据自己项目决定
      //   chunkFilename: `css/[name].[contenthash:8].${Version}.css`
      // }
    }

    const getItemData = () => {
      temp['extract'] = {
        // 修改打包后css文件名   // css打包文件，添加时间戳
        filename: `css/[name].${Version}.css`, // 此处static/css/xxx 目录根据自己打包情况来定,我使用的就没有static一层,所以直接去掉static即可。根据自己项目决定
        chunkFilename: `css/[name].${Version}.css`
      }
    }

    const tempAction = {
      'production': () => {
        temp['extract'] = {
          // 修改打包后css文件名   // css打包文件，添加时间戳
          filename: `css/[name].[contenthash:8].${Version}.css`, // 此处static/css/xxx 目录根据自己打包情况来定,我使用的就没有static一层,所以直接去掉static即可。根据自己项目决定
          chunkFilename: `css/[name].[contenthash:8].${Version}.css`
        }
      },
      // 'test': () => { getItemData() },
      // 'sit3': () => { getItemData() },
      // 'dev': () => { getItemData() }
      'default': () => { getItemData() }
    }
    tempAction[process.env.NODE_ENV] && tempAction[process.env.NODE_ENV]() || tempAction['default']()

    return temp
  }
  return {
    /*
      Vue-cli3:
      Crashed when using Webpack `import()` #2463
      https://github.com/vuejs/vue-cli/issues/2463
     */
    // 如果你不需要生产环境的 source map，可以将其设置为 false 以加速生产环境构建。
    productionSourceMap: false,
    // qiankuan打包时放开
    // outputDir: "../dist/main",
    // 多入口配置
    // pages: {
    //   index: {
    //     entry: 'src/main.js',
    //     template: 'public/index.html',
    //     filename: 'index.html',
    //   }
    // },
    // 打包app时放开该配置
    // publicPath:'/',
    configureWebpack: config => {
      const getOutputConfig = (type) => {
        config.output.filename = `js/[name].${type}${Version}.js`
        config.output.chunkFilename = `js/[name].${type}${Version}.js`
      }
      // 生产环境取消 console.log
      const cancelLogList = {
        'production': () => {
          // config.output.filename = `js/[name].[contenthash:8].${Version}.js`
          // config.output.chunkFilename = `js/[name].[contenthash:8].${Version}.js`
          getOutputConfig('[contenthash:8].')
          config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true
        },
        // 'test': () => { getOutputConfig('') },
        // 'sit3': () => { getOutputConfig('') },
        // 'dev': () => { getOutputConfig('') }
        'default': () => { getOutputConfig('') }
      }
      cancelLogList[process.env.NODE_ENV] && cancelLogList[process.env.NODE_ENV]() || cancelLogList['default']()

    },
    chainWebpack: (config) => {
      // 移除prefetch插件
      config.plugins.delete('prefetch')
      // 只保留中文语言包
      config.plugin('ContextReplacementPlugin').use(webpack.ContextReplacementPlugin, [/moment[/\\]locale$/, /zh-cn/])

      config.resolve.alias
        .set('@$', resolve('src'))
        .set('@api', resolve('src/api'))
        .set('@assets', resolve('src/assets'))
        .set('@comp', resolve('src/components'))
        .set('@views', resolve('src/views'))
      // 开启js\css压缩
      const getCompressionPlugin = () => {
        config.plugin('compressionPlugin').use(
          new CompressionPlugin({
            test: /\.(js|css|less)$/, // 匹配文件名
            threshold: 10240, // 对超过10k的数据压缩
            deleteOriginalAssets: false // 不删除源文件
          })
        )
      }
      // 限制打包的个数
      const getChunkPlugin = () => {
        // 限制打包的个数(减少打包生成的js文件和css文件)
        // 在合并chunk时，webpack会尝试识别出具有重复模块的chunk，并优先进行合并。任何模块都不会被合并到entry chunk中，以免影响初始页面加载时间
        // maxChunks：使用大于或等于 1 的值，来限制 chunk 的最大数量。使用 1 防止添加任何其他额外的 chunk，这是因为 entry/main chunk 也会包含在计数之中。
        // minChunkSize: 设置 chunk 的最小大小。
        config.plugin('chunkPlugin').use(webpack.optimize.LimitChunkCountPlugin, [{
          maxChunks: 5,
          minChunkSize: 10000
        }])
      }
      // 开启js\css压缩
      const tempAction = {
        // 生产环境
        'production': () => {
          getCompressionPlugin()
          getChunkPlugin()
        },
        // // 测试环境
        // 'test': getCompressionPlugin,
        // 'sit3': () => {
        //   getCompressionPlugin()
        //   // getChunkPlugin()
        // },
        // // dev环境
        // 'dev': getCompressionPlugin
        'default': getCompressionPlugin
      }
      tempAction[process.env.NODE_ENV] && tempAction[process.env.NODE_ENV]() || tempAction['default']()

      // 配置 webpack 识别 markdown 为普通的文件
      config.module
        .rule('markdown')
        .test(/\.md$/)
        .use()
        .loader('file-loader')
        .end()

      // 编译vxe-table包里的es6代码，解决IE11兼容问题
      config.module
        .rule('vxe')
        .test(/\.js$/)
        .include
          .add(resolve('node_modules/vxe-table'))
          .add(resolve('node_modules/vxe-table-plugin-antd'))
          .end()
          .use()
          .loader('babel-loader')
          .end()

          config.plugin('html').tap(args => {
            args[0].title = Version
            args[0]['version'] = Version
            args[0]['metaInfo'] = Version

            return args
          })
    },
    css: getCssConfig(),
    devServer: {
      port: 84,
      // hot: true,
      disableHostCheck: true, // 热更新
      // overlay: {
      //     warnings: false,
      //     errors: true,
      // },
      // headers: {
      //     'Access-Control-Allow-Origin': '*',
      // },
      proxy: {
       /* '/api': {
          target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro', //mock API接口系统
          ws: false,
          changeOrigin: true,
          pathRewrite: {
            '/jeecg-boot': ''  //默认所有请求都加了jeecg-boot前缀，需要去掉
          }
        }, */
        /* 注意：jeecgboot前端做了改造，此处不需要配置跨域和后台接口（只需要改.env相关配置文件即可）
            issues/3462 很多人此处做了配置，导致刷新前端404问题，请一定注意 */
        '/jeecg-boot': {
          target: 'http://localhost:8080', // https://api.boot.jeecg.com
          ws: false,
          changeOrigin: true
        },
      }

      // 此处开启 https
      // https: true
    },
    pluginOptions: {
      'style-resources-loader': {
        preProcessor: 'less',
        patterns: [
          // 全局变量路径
          path.resolve(__dirname, './src/assets/less/global.less')
        ]
      }
    },
    lintOnSave: undefined
  }
}
module.exports = getConfig()
